﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WeChatV3Pay.Core.Dtos
{
    public class JsApiPayDto
    {
        /// <summary>
        /// 应用ID
        /// </summary>
        /// <example>wxd678efh567hg6787</example>
        /// <remarks>由微信生成的应用ID，全局唯一。请求基础下单接口时请注意APPID的应用属性，例如公众号场景下，需使用应用属性为公众号的服务号APPID</remarks>
        [JsonProperty("appid")]
        public string AppId { get; set; }

        /// <summary>
        /// 应用ID
        /// </summary>
        /// <example>1230000109</example>
        /// <remarks>直连商户的商户号，由微信支付生成并下发。</remarks>
        [JsonProperty("mchid")]
        public string MchId { get; set; }

        /// <summary>
        /// 商品描述
        /// </summary>
        /// <example>Image形象店-深圳腾大-QQ公仔</example>
        [JsonProperty("description")]
        public string Description { get; set; }

        /// <summary>
        /// 商户订单号
        /// </summary>
        /// <example>1217752501201407033233368018</example>
        /// <remarks>商户系统内部订单号，只能是数字、大小写字母_-*且在同一个商户号下唯一</remarks>
        [JsonProperty("out_trade_no")]
        public string OutTradeNo { get; set; }

        /// <summary>
        /// 交易结束时间
        /// </summary>
        /// <example>2018-06-08T10:34:56+08:00</example>
        /// <remarks>订单失效时间，遵循rfc3339标准格式，格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE，yyyy-MM-DD表示年月日，T出现在字符串中，表示time元素的开头，HH:mm:ss表示时分秒，TIMEZONE表示时区（+08:00表示东八区时间，领先UTC8小时，即北京时间）。例如：2015-05-20T13:29:35+08:00表示，北京时间2015年5月20日 13点29分35秒。</remarks>
        [JsonProperty("time_expire")]
        public string IimeExpire { get; set; }

        /// <summary>
        /// 附加数据
        /// </summary>
        /// <remarks>附加数据，在查询API和支付通知中原样返回，可作为自定义参数使用，实际情况下只有支付完成状态才会返回该字段。</remarks>
        [JsonProperty("attach")]
        public string Attach { get; set; }

        /// <summary>
        /// 附加数据
        /// </summary>
        /// <example>https://www.weixin.qq.com/wxpay/pay.php</example>
        /// <remarks>异步接收微信支付结果通知的回调地址，通知url必须为外网可访问的url，不能携带参数。 公网域名必须为https，如果是走专线接入，使用专线NAT IP或者私有回调域名可使用http</remarks>
        [JsonProperty("notify_url")]
        public string NotifyUrl { get; set; }

        /// <summary>
        /// 订单优惠标记
        /// </summary>
        /// <example>WXG</example>
        [JsonProperty("goods_tag")]
        public string GoodsTag { get; set; }

        /// <summary>
        /// 订单优惠标记
        /// </summary>
        /// <remarks>传入true时，支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能，传此字段才可生效。</remarks>
        [JsonProperty("support_fapiao")]
        public bool SupportFaPiao { get; set; }

        /// <summary>
        /// 订单金额
        /// </summary>
        /// <example>{"total":100,"currency":"CNY"}</example>
        /// <remarks>订单金额信息</remarks>
        [JsonProperty("amount")]
        public Amount Amount { get; set; }

        /// <summary>
        /// 支付者
        /// </summary>
        /// <example>{"openid":"oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"}</example>
        /// <remarks>支付者信息</remarks>
        [JsonProperty("payer")]
        public Payer Payer { get; set; }

        /// <summary>
        /// 优惠功能
        /// </summary>
        /// <remarks>优惠功能</remarks>
        [JsonProperty("detail")]
        public Detail? Detail { get; set; }

        /// <summary>
        /// 场景信息
        /// </summary>
        /// <remarks>支付场景描述</remarks>
        [JsonProperty("scene_info")]
        public SceneInfo? SceneInfo { get; set; }

        /// <summary>
        /// 结算信息
        /// </summary>
        [JsonProperty("settle_info")]
        public SettleInfo? SettleInfo { get; set; }
    }

    /// <summary>
    /// 订单金额
    /// </summary>
    public class Amount
    {
        /// <summary>
        /// 总金额
        /// </summary>
        /// <example>100</example>
        /// <remarks>订单总金额，单位为分。</remarks>
        [JsonProperty("total")]
        public int Total { get; set; }

        /// <summary>
        /// 货币类型
        /// </summary>
        /// <example>CNY</example>
        /// <remarks>CNY：人民币，境内商户号仅支持人民币。</remarks>
        [JsonProperty("currency")]
        public string Currency { get; set; }
    }

    /// <summary>
    /// 支付者
    /// </summary>
    /// <example></example>
    /// <remarks>支付者信息</remarks>
    public class Payer
    {
        /// <summary>
        /// 用户标识
        /// </summary>
        /// <example>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</example>
        /// <remarks>用户在直连商户appid下的唯一标识。 下单前需获取到用户的Openid</remarks>
        [JsonProperty("openid")]
        public string OpenId { get; set; }
    }

    /// <summary>
    /// 优惠功能
    /// </summary>
    public class Detail
    {
        /// <summary>
        /// 订单原价
        /// </summary>
        /// <example>608800</example>
        /// <remarks>1、商户侧一张小票订单可能被分多次支付，订单原价用于记录整张小票的交易金额。2、当订单原价与支付金额不相等，则不享受优惠。3、该字段主要用于防止同一张小票分多次支付，以享受多次优惠的情况，正常支付订单不必上传此参数。</remarks>
        [JsonProperty("cost_price")]
        public int CostPrice { get; set; }

        /// <summary>
        /// 商品小票ID
        /// </summary>
        /// <example>微信123</example>
        [JsonProperty("invoice_id")]
        public string InvoiceId { get; set; }

        /// <summary>
        /// 单品列表
        /// </summary>
        /// <remarks>单品列表信息</remarks>
        [JsonProperty("goods_detail")]
        public List<GoodsDetail> GoodsDetail { get; set; }

        /// <summary>
        /// 单品列表
        /// </summary>
        /// <remarks>单品列表信息</remarks>
        [JsonProperty("scene_info")]
        public List<SceneInfo> SceneInfo { get; set; }
    }

    /// <summary>
    /// 单品列表
    /// </summary>
    public class GoodsDetail
    {
        /// <summary>
        /// 商户侧商品编码
        /// </summary>
        /// <example>1246464644</example>
        /// <remarks>由半角的大小写字母、数字、中划线、下划线中的一种或几种组成</remarks>
        [JsonProperty("merchant_goods_id")]
        public string MerchantGoodsId { get; set; }

        /// <summary>
        /// 微信支付商品编码
        /// </summary>
        /// <example>1001</example>
        /// <remarks>微信支付定义的统一商品编号（没有可不传）</remarks>
        [JsonProperty("wechatpay_goods_id")]
        public string WechatpayGoodsId { get; set; }

        /// <summary>
        /// 商品名称
        /// </summary>
        /// <example>iPhoneX 256G</example>
        /// <remarks>商品的实际名称</remarks>
        [JsonProperty("goods_name")]
        public string GoodsName { get; set; }

        /// <summary>
        /// 商品数量
        /// </summary>
        /// <example>1</example>
        /// <remarks>用户购买的数量</remarks>
        [JsonProperty("quantity")]
        public int Quantity { get; set; }

        /// <summary>
        /// 商品单价
        /// </summary>
        /// <example>528800</example>
        /// <remarks>单位为：分。如果商户有优惠，需传输商户优惠后的单价(例如：用户对一笔100元的订单使用了商场发的纸质优惠券100-50，则活动商品的单价应为原单价-50)</remarks>
        [JsonProperty("unit_price")]
        public int UnitPrice { get; set; }
    }

    /// <summary>
    /// 场景信息
    /// </summary>
    /// <remarks>场景信息</remarks>
    public class SceneInfo
    {
        /// <summary>
        /// 用户终端IP
        /// </summary>
        /// <example>14.23.150.211</example>
        /// <remarks>用户的客户端IP，支持IPv4和IPv6两种格式的IP地址。</remarks>
        [JsonProperty("payer_client_ip")]
        public int PayerClientIp { get; set; }

        /// <summary>
        /// 商户端设备号
        /// </summary>
        /// <example>013467007045764</example>
        /// <remarks>商户端设备号（门店号或收银设备ID）。</remarks>
        [JsonProperty("device_id")]
        public string DeviceId { get; set; }

        /// <summary>
        /// 单品列表
        /// </summary>
        /// <remarks>单品列表信息</remarks>
        [JsonProperty("store_info")]
        public List<StoreInfo> StoreInfo { get; set; }
    }

    /// <summary>
    /// 商户门店信息
    /// </summary>
    public class StoreInfo
    {
        /// <summary>
        /// 门店编号
        /// </summary>
        /// <example>0001</example>
        /// <remarks>商户侧门店编号</remarks>
        [JsonProperty("id")]
        public int Id { get; set; }

        /// <summary>
        /// 门店名称
        /// </summary>
        /// <example>腾讯大厦分店</example>
        /// <remarks>商户侧门店名称</remarks>
        [JsonProperty("name")]
        public string Name { get; set; }

        /// <summary>
        /// 地区编码
        /// </summary>
        /// <example>440305</example>
        /// <remarks>地区编码，详细请见省市区编号对照表。</remarks>
        [JsonProperty("area_code")]
        public string AreaCode { get; set; }

        /// <summary>
        /// 详细地址
        /// </summary>
        /// <example>广东省深圳市南山区科技中一道10000号</example>
        /// <remarks>详细的商户门店地址</remarks>
        [JsonProperty("address")]
        public string Address { get; set; }
    }


    /// <summary>
    /// 场景信息
    /// </summary>
    /// <remarks>场景信息</remarks>
    public class SettleInfo
    {
        /// <summary>
        /// 是否指定分账
        /// </summary>
        [JsonProperty("profit_sharing")]
        public bool profit_sharing { get; set; }
    }
}
